/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.be;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import org.cip.esymons.tramite.be.DocumentoGenerado;

/**
 *
 * @author Gilmar Montoya
 */
@Entity
@Table(name = "tes_documento_pago")
@DiscriminatorValue("PAG")
@PrimaryKeyJoinColumn(name = "fk_doc_codigo", referencedColumnName = "doc_codigo")
public class DocumentoPago extends DocumentoGenerado implements Serializable {

    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "dpa_serie")
    private String dpaSerie;
    @Basic(optional = false)
    @Column(name = "dpa_fechemision", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dpaFechemision;
    @Basic(optional = false)
    @Column(name = "dpa_estado", nullable = false)
    private EnumEstadoDocumentoPago estado;
    @Column(name = "dpa_igv")
    private Double dpaIgv;
    @JoinColumn(name = "tmo_codigo", referencedColumnName = "tmo_codigo")
    @ManyToOne
    private TipoMoneda tmoCodigo;
    @Basic(optional = false)
    @Column(name = "dpa_fechpago", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dpaFechPago;
    @Column(name = "dpa_monto")
    private Double monto;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkDocCodigo", fetch = FetchType.LAZY)
    private List<HistorialDocupago> historialDocupagoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkDocCodigodpa", fetch = FetchType.LAZY)
    private List<BeneficiarioPagocolegiatura> beneficiarioPagocolegiaturaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "docCodigo", fetch = FetchType.LAZY)
    private List<PagosAcotacion> listaPagosAcotaciones;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "documentoPago", fetch = FetchType.LAZY)
    private List<CierreDocumento> listaCierreDocumento;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "docCodigo", fetch = FetchType.LAZY)
    private List<DetPagoAgrupado> listaDetPagoAgrupados;
    @Transient
    private boolean seleccionado = false;

    public DocumentoPago() {
    }

    public DocumentoPago(Long docCodigo) {
        this.docCodigo = docCodigo;
    }

    public DocumentoPago(Long docCodigo, String dpaSerie, Date dpaFechemision, EnumEstadoDocumentoPago dpaEstado, long fkSolCodigo) {
        this.docCodigo = docCodigo;
        this.dpaSerie = dpaSerie;
        this.dpaFechemision = dpaFechemision;
        this.estado = dpaEstado;

    }

    public String getDpaSerie() {
        return dpaSerie;
    }

    public void setDpaSerie(String dpaSerie) {
        this.dpaSerie = dpaSerie;
    }

    public Date getDpaFechemision() {
        return dpaFechemision;
    }

    public void setDpaFechemision(Date dpaFechemision) {
        this.dpaFechemision = dpaFechemision;
    }

    public EnumEstadoDocumentoPago getEstado() {
        return estado;
    }

    public void setEstado(EnumEstadoDocumentoPago dpaEstado) {
        this.estado = dpaEstado;
    }

    public Double getDpaIgv() {
        return dpaIgv;
    }

    public void setDpaIgv(Double dpaIgv) {
        this.dpaIgv = dpaIgv;
    }

    public List<BeneficiarioPagocolegiatura> getBeneficiarioPagocolegiaturaList() {
        return beneficiarioPagocolegiaturaList;
    }

    public void setBeneficiarioPagocolegiaturaList(List<BeneficiarioPagocolegiatura> beneficiarioPagocolegiaturaList) {
        this.beneficiarioPagocolegiaturaList = beneficiarioPagocolegiaturaList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (docCodigo != null ? docCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof DocumentoPago)) {
            return false;
        }
        DocumentoPago other = (DocumentoPago) object;
        if ((this.docCodigo == null && other.docCodigo != null) || (this.docCodigo != null && !this.docCodigo.equals(other.docCodigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "org.cip.esymons.tesoreria.be.DocumentoPago[docCodigo=" + docCodigo + "]";
    }

    /**
     * @return the historialDocupagoList
     */
    public List<HistorialDocupago> getHistorialDocupagoList() {
        return historialDocupagoList;
    }

    /**
     * @param historialDocupagoList the historialDocupagoList to set
     */
    public void setHistorialDocupagoList(List<HistorialDocupago> historialDocupagoList) {
        this.historialDocupagoList = historialDocupagoList;
    }

    /**
     * @return the tmoCodigo
     */
    public TipoMoneda getTmoCodigo() {
        return tmoCodigo;
    }

    /**
     * @param tmoCodigo the tmoCodigo to set
     */
    public void setTmoCodigo(TipoMoneda tmoCodigo) {
        this.tmoCodigo = tmoCodigo;
    }

    /**
     * @return the listaPagosAcotaciones
     */
    public List<PagosAcotacion> getListaPagosAcotaciones() {
        return listaPagosAcotaciones;
    }

    /**
     * @param listaPagosAcotaciones the listaPagosAcotaciones to set
     */
    public void setListaPagosAcotaciones(List<PagosAcotacion> listaPagosAcotaciones) {
        this.listaPagosAcotaciones = listaPagosAcotaciones;
    }

    /**
     * @return the listaCierreDocumento
     */
    public List<CierreDocumento> getListaCierreDocumento() {
        return listaCierreDocumento;
    }

    /**
     * @param listaCierreDocumento the listaCierreDocumento to set
     */
    public void setListaCierreDocumento(List<CierreDocumento> listaCierreDocumento) {
        this.listaCierreDocumento = listaCierreDocumento;
    }

    /**
     * @return the dpaFechPago
     */
    public Date getDpaFechPago() {
        return dpaFechPago;
    }

    /**
     * @param dpaFechPago the dpaFechPago to set
     */
    public void setDpaFechPago(Date dpaFechPago) {
        this.dpaFechPago = dpaFechPago;
    }

    /**
     * @return the monto
     */
    public Double getMonto() {
        return monto;
    }

    /**
     * @param monto the monto to set
     */
    public void setMonto(Double monto) {
        this.monto = monto;
    }

    /**
     * @return the listaDetPagoAgrupados
     */
    public List<DetPagoAgrupado> getListaDetPagoAgrupados() {
        return listaDetPagoAgrupados;
    }

    /**
     * @param listaDetPagoAgrupados the listaDetPagoAgrupados to set
     */
    public void setListaDetPagoAgrupados(List<DetPagoAgrupado> listaDetPagoAgrupados) {
        this.listaDetPagoAgrupados = listaDetPagoAgrupados;
    }

    public List<DetPagoAgrupado> getListaDetPagoAgrupadosOrdenados() {
        if (listaDetPagoAgrupados != null && listaDetPagoAgrupados.size() > 0) {
            for(DetPagoAgrupado dpa : listaDetPagoAgrupados){
                if(dpa.getCuentaIngreso()==null){
                    dpa.setCuentaIngreso(new CuentaIngreso("000", "Fraccionamiento"));
                }
            }
            Collections.sort(listaDetPagoAgrupados, new Comparator<DetPagoAgrupado>() {

                @Override
                public int compare(DetPagoAgrupado o1, DetPagoAgrupado o2) {
                    return Integer.valueOf(o1.getCuentaIngreso().getCinCodigo()) - Integer.valueOf(o2.getCuentaIngreso().getCinCodigo());
                }
            });
            return listaDetPagoAgrupados;
        } else {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public String getMontoEnLetras() {
        Number2Text convertidor = new Number2Text();
        return convertidor.convertirLetrasParaDoc(monto);
    }

    /**
     * @return the seleccionado
     */
    public boolean isSeleccionado() {
        return seleccionado;
    }

    /**
     * @param seleccionado the seleccionado to set
     */
    public void setSeleccionado(boolean seleccionado) {
        this.seleccionado = seleccionado;
    }
}
